package br.com.registrofinancas.database;

import java.util.ArrayList;
import java.util.List;

import br.com.registrofinancas.model.ExpenseVO;
import br.com.registrofinancas.model.IncomeVO;
import br.com.registrofinancas.model.MovimentoOrigemVO;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement;

public class MovimentosOrigemDAO {
	protected Context contexto;
	protected SQLiteDatabase db;
	protected SQLiteStatement insertStatement;
	protected static final String TABELA = "MOVIMENTO_ORIGEM";	
	protected static final String INSERT = "INSERT INTO " + TABELA + "(id_movimento_entrada, id_movimento_saida,valor) VALUES (?,?,?)";
	
	public MovimentosOrigemDAO(Context contexto) {
		this.contexto = contexto;
		this.db = DataSource.geDBtInstance(contexto);
	}
	
	public long insert(MovimentoOrigemVO movimentoOrigem) {
		this.insertStatement = this.db.compileStatement(INSERT);
		this.insertStatement.bindLong(1, movimentoOrigem.getEntrada().getId());
		this.insertStatement.bindLong(2, movimentoOrigem.getSaida().getId());
		this.insertStatement.bindDouble(3, movimentoOrigem.getValor());
		return insertStatement.executeInsert();
	}	
	
	public long deletePorSaida( ExpenseVO saida ){
		String [] parametros = {saida.getId().toString()};
		return db.delete(TABELA, "id_movimento_saida = ?", parametros);
	}
	
	public long deletePorEntrada( IncomeVO entrada ){
		String [] parametros = {entrada.getId().toString()};
		return db.delete(TABELA, "id_movimento_entrada = ?", parametros);
	}	

	public long deleteAll( ) {
		return db.delete( TABELA, null, null ) ;
	}
	
	public List<MovimentoOrigemVO> getMovimentosOrigem( ) {
		List<MovimentoOrigemVO> list = new ArrayList<MovimentoOrigemVO>( ) ;

		Cursor cursor = 
				this.db.query( TABELA, new String[ ] { "id", "id_movimento_entrada", "id_movimento_saida", "valor" }, 
							   null, null, null, null, "id" ) ;
		
		if (cursor.moveToFirst( )) {
			MovimentosEntradaDAO entradaDAO = new MovimentosEntradaDAO(contexto);
			MovimentosSaidaDAO saidaDAO = new MovimentosSaidaDAO(contexto);
			do {
				MovimentoOrigemVO origem = new MovimentoOrigemVO( ) ;
				origem.setId( cursor.getInt( 0 ) ) ;
				origem.setEntrada( entradaDAO.getEntradaPorId(cursor.getInt( 1 )) ) ;
				origem.setSaida( saidaDAO.getSaidaPorId(cursor.getInt( 2 ))  ) ;
				origem.setValor( cursor.getDouble( 3 ) ) ;
				list.add( origem ) ;
			}
			while (cursor.moveToNext( )) ;
		}
		
		if (null != cursor && !cursor.isClosed( )) {
			cursor.close( ) ;
		}
		
		return list ;
	}
	
	public MovimentoOrigemVO getMovimentoOrigemPorId( Integer id) {
		MovimentoOrigemVO origem = null;

		Cursor cursor = 
				this.db.query( TABELA, new String[ ] { "id", "id_movimento_entrada", "id_movimento_saida", "valor" }, 
							   "id = ?", new String[]{id.toString()}, null, null, "id" ) ;
		
		if (cursor.moveToFirst( )) {
			
			MovimentosEntradaDAO entradaDAO = new MovimentosEntradaDAO(contexto);
			MovimentosSaidaDAO saidaDAO = new MovimentosSaidaDAO(contexto);
			
			origem = new MovimentoOrigemVO( ) ;
			origem.setId( cursor.getInt( 0 ) ) ;
			origem.setEntrada( entradaDAO.getEntradaPorId(cursor.getInt( 1 )) ) ;
			origem.setSaida( saidaDAO.getSaidaPorId(cursor.getInt( 2 ))  ) ;
			origem.setValor( cursor.getDouble( 3 ) ) ;
		}
		
		if (null != cursor && !cursor.isClosed( )) {
			cursor.close( ) ;
		}
		
		return origem ;
	}	
	
	public List<MovimentoOrigemVO> getMovimentosOrigemPorIdEntrada( Integer id) {
		List<MovimentoOrigemVO> list = new ArrayList<MovimentoOrigemVO>( ) ;

		Cursor cursor = 
				this.db.query( TABELA, new String[ ] { "id", "id_movimento_entrada", "id_movimento_saida", "valor" }, 
							   "id_movimento_entrada = ?", new String[]{id.toString()}, null, null, "id" ) ;
		
		if (cursor.moveToFirst( )) {
			MovimentosEntradaDAO entradaDAO = new MovimentosEntradaDAO(contexto);
			MovimentosSaidaDAO saidaDAO = new MovimentosSaidaDAO(contexto);
			do {
				MovimentoOrigemVO origem = new MovimentoOrigemVO( ) ;
				origem.setId( cursor.getInt( 0 ) ) ;
				origem.setEntrada( entradaDAO.getEntradaPorId(cursor.getInt( 1 )) ) ;
				origem.setSaida( saidaDAO.getSaidaPorId(cursor.getInt( 2 ))  ) ;
				origem.setValor( cursor.getDouble( 3 ) ) ;
				list.add( origem ) ;
			}
			while (cursor.moveToNext( )) ;
		}
		
		if (null != cursor && !cursor.isClosed( )) {
			cursor.close( ) ;
		}
		
		return list ;
	}

	
	public List<MovimentoOrigemVO> getMovimentosOrigemPorIdSaida( Integer id, ExpenseVO saida) {
		List<MovimentoOrigemVO> list = new ArrayList<MovimentoOrigemVO>( ) ;

		Cursor cursor = 
				this.db.query( TABELA, new String[ ] { "id", "id_movimento_entrada", "id_movimento_saida", "valor" }, 
							   "id_movimento_saida = ?", new String[]{id.toString()}, null, null, "id" ) ;
		
		if (cursor.moveToFirst( )) {
			MovimentosEntradaDAO entradaDAO = new MovimentosEntradaDAO(contexto);
			MovimentosSaidaDAO saidaDAO = new MovimentosSaidaDAO(contexto);
			do {
				MovimentoOrigemVO origem = new MovimentoOrigemVO( ) ;
				origem.setId( cursor.getInt( 0 ) ) ;
				origem.setEntrada( entradaDAO.getEntradaPorId(cursor.getInt( 1 )) ) ;
				if(null == saida){
					origem.setSaida( saidaDAO.getSaidaPorId(cursor.getInt( 2 ))  ) ;
				}else{
					origem.setSaida(saida);
				}
				origem.setValor( cursor.getDouble( 3 ) ) ;
				list.add( origem ) ;
			}
			while (cursor.moveToNext( )) ;
		}
		
		if (null != cursor && !cursor.isClosed( )) {
			cursor.close( ) ;
		}
		
		return list ;
	}
	
}